package computer.util;

import java.util.Properties;
import jakarta.mail.*;
import jakarta.mail.internet.*;

public class MailUtil {

	// 腾讯企业邮件服务器配置
		private static final String SMTP_HOST = "smtp.qq.com";
		private static final int SMTP_PORT = 465; // 腾讯企业邮箱的SMTP端口

		private static final String SMTP_PASSWORD = "kzpqixdhccowdbij"; // 衡的邮箱授权码

		// This class is used to send email using QQ mail
		public static void sendMail(String to, String from, String subject, String body, boolean bodyIsHTML)
				throws MessagingException {

			// 1 - get a mail session
			// 配置邮件服务器属性
			Properties props = new Properties(); // 创建一个Properties对象，用于存储邮件服务器的配置信息（键值对）
			props.put("mail.transport.protocol", "smtps"); // 使用smtps协议
			props.put("mail.smtps.host", SMTP_HOST); // SMTP服务器地址
			props.put("mail.smtps.port", SMTP_PORT); //
			props.put("mail.smtps.auth", "true"); // 是否需要身份验证
			props.put("mail.smtps.quitwait", "false"); // 是否等待服务器响应
			props.put("mail.smtp.ssl.enable", "true"); // 启用SSL
			props.put("mail.smtp.ssl.trust", SMTP_HOST); // 信任的主机
			props.put("mail.smtp.socketFactory.port", String.valueOf(SMTP_PORT)); // 设置SSL端口
			props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); // 使用SSL套接字工厂
			props.put("mail.smtp.socketFactory.fallback", "false"); // 禁用默认的套接字工厂

			/*
			 * 创建了一个邮件会话，并配置了SMTP服务器的认证信息。 当发送邮件时，
			 * Jakarta Mail会使用这里提供的用户名和密码来登录SMTP服务器。
			 * new Authenticator() {...}这里创建了一个匿名内部类，
			 * 继承自jakarta.mail.Authenticator抽象类，并覆盖了它的getPasswordAuthentication()方法。
			 */
			Session session = Session.getInstance(props, new Authenticator() {
				@Override
				protected PasswordAuthentication getPasswordAuthentication() {
					return new PasswordAuthentication(from, SMTP_PASSWORD);
				}
				/*
				 * getPasswordAuthentication()这个方法在邮件服务器要求认证时会被自动调用，
				 * 它需要返回一个PasswordAuthentication对象，包含： from：发送邮件的邮箱地址（用户名）
				 * SMTP_PASSWORD：SMTP服务器的登录密码
				 */
			});

			// 2 - create a message
			try {
				// // 创建MimeMessage对象
				Message message = new MimeMessage(session);

				// 设置邮件主题
				message.setSubject(subject);
				if (bodyIsHTML) {
					message.setContent(body, "text/html");
				} else {
					message.setText(body);
				}

				// 3 - address the message
				Address fromAddress = new InternetAddress(from); // 发件人地址
				Address toAddress = new InternetAddress(to); // 收件人地址
				// 设置发件人和收件人地址
				message.setFrom(fromAddress);
				message.setRecipient(Message.RecipientType.TO, toAddress);

				// 4 - send the message
				// 发送邮件
				Transport transport = session.getTransport(); // 获取传输对象
				transport.connect(from, SMTP_PASSWORD); // 连接邮件服务器
				transport.sendMessage(message, message.getAllRecipients()); // 发送邮件
				transport.close(); // 关闭连接
			} catch (MessagingException e) {
				e.printStackTrace();
				throw new MessagingException("Failed to send email: " + e.getMessage());
			}

		}
}